热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

半径|圆心_Android碎裂的粒子效果

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android碎裂的粒子效果相关的知识,希望对你有一定的参考价值。最近看到一段时间都没怎么更新文章了,一直

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Android碎裂的粒子效果相关的知识,希望对你有一定的参考价值。


最近看到一段时间都没怎么更新文章了,一直在学习ios相关内容。偶然间看到一个碎裂的粒子效果,觉得很有意思,就查了查,参考下网上的思路自己撸了个轮子。

好了,说了这么多,先看看效果吧~

依惯例,先说下行文思路吧,首先我们先简单分析下效果,拆分关注点,粒子效果是怎么产生的?我的解决方案就是先获取当前要碎裂的view的缓存视图,然后根据图片获取各个坐标点的颜色值,在整个DecorView盖上一层视图,这个视图就根据获取的颜色值在要碎裂的view的位置drawCircle,之后变化圆心和半径以及透明度从而产生碎裂效果。那么,我们要解决的问题已经简化为几个点了,看怎么一个一个将其击破。



一、获取view的视图
二、获取要碎裂的view的位置以及获取各个位置的颜色值
三、变化各个属性值产生动画碎裂效果



一、获取view的视图

获取view的视图也就是要获取这个视图的截图,有两种方式可以来做:

1、可以用Canvas来获取Bitmap

public Bitmap getBitmapFromView(View view)
Bitmap bmp = Bitmap.createBitmap(webView.getWidth(),
webView.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
view.draw(canvas);
return bmp;

2、用getDrawingCache来获取Bitmap

private static Bitmap getCacheBitmapFromView(View view)
final boolean drawingCacheEnabled = true;
view.setDrawingCacheEnabled(drawingCacheEnabled);
view.buildDrawingCache(drawingCacheEnabled);
final Bitmap drawingCache = view.getDrawingCache();
Bitmap bitmap;
if (drawingCache != null)
bitmap = Bitmap.createBitmap(drawingCache);
view.setDrawingCacheEnabled(false);
else
bitmap = null;

return bitmap;

通过这两种方式都可以获取这个视图的图片,而为什么我们要获取这个视图的图片呢,因为要根据这个图片来获取各个位置的颜色值,为之后绘制粒子效果服务。


二、获取要碎裂的view的位置以及获取各个位置的颜色值

获取view的位置,之前使用过getGlobalVisibleRect方法来获取位置,但很多时候并不是很准确,比如有ActionBar的时候。

Rect rect = new Rect();
view.getGlobalVisibleRect(rect);

之后测试使用getLocationInWindow这种方式挺不错,这个方法的官方注释为这样写Computes the coordinates of this view in its window.:

int[] location = new int[2];
view.getLocationInWindow(location);
Rect rect = new Rect(location[0],location[1],location[0]+view.getMeasuredWidth(),location[1]+view.getMeasuredHeight());

在获取视图位置之后,我们要获取各个位置的颜色值来绘制在这片区域内,调用bitmap.getPixel方法获取各个位置的颜色值:

public static Particle[][] generateParticles(Bitmap bitmap, Rect bound)
int w = bound.width();
int h = bound.height();
int partW_Count = w / Particle.PART_WH;
int partH_Count = h / Particle.PART_WH;
Particle[][] particles = new Particle[partH_Count][partW_Count];
Point point = null;
for (int row = 0; row //行
for (int column = 0; column //列
//取得当前粒子所在位置的颜色
int color = bitmap.getPixel(column * Particle.PART_WH, row * Particle.PART_WH);
point = new Point(column, row); //x是列,y是行
particles[row][column] = Particle.generateParticle(color, bound, point);


return particles;

三、变化各个属性值产生动画碎裂效果

首先我们要在当前视图上覆盖一层产生碎裂效果的视图:

private void attachToActivity(Activity activity)
ViewGroup rootView = (ViewGroup) activity.getWindow().getDecorView();
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
rootView.addView(this, lp);

将我们要绘制粒子动画效果的添加进布局视图中,然后我们就可以开始绘制了。
开启属性动画,根据动画流程变化Particle的相关属性:

//x值
public float cx;
//y值
public float cy;
//绘制圆的半径
public float radius;
//颜色
public int color;
//透明度
public float alpha;

在自定义视图的onDraw方法,遍历所有我们保存的粒子Particle,改变相关属性值:

@Override
protected void onDraw(Canvas canvas)
if (mParticleAnimator !=null)
drawParticle(canvas);

public void drawParticle(Canvas canvas)
//动画结束停止
if(!mParticleAnimator.isRunning())
return;

for (Particle[] particle : mParticleAnimator.getParticles())
for (Particle p : particle)
p.update((Float) mParticleAnimator.getAnimatedValue());
mPaint.setColor(p.color);
mPaint.setAlpha((int) (Color.alpha(p.color) * p.alpha));
canvas.drawCircle(p.cx, p.cy, p.radius, mPaint);//


invalidate();

//更新相关属性值 主要是随机生成x y值以及碎裂大小
public void update(float factor)
cx = cx + factor * random.nextInt(mBound.width()) * (random.nextFloat() - 0.5f);
cy = cy + factor * (mBound.height()/(random.nextInt(4)+1)) ;
radius = radius - factor * random.nextInt(3);;
if (radius<&#61;0)
radius &#61; 0;
alpha &#61; 1f - factor;

OK&#xff0c;到这里我们就基本实现了这个碎裂效果&#xff0c;整体注意点基本就这么多&#xff0c;我把它简单封装了下&#xff0c;使用方式也很简单&#xff1a;

final ParticleView particleAnimator &#61; new ParticleView(MainActivity.this,3000);//3000为动画持续时间
particleAnimator.setOnAnimationListener(new ParticleView.OnAnimationListener()
&#64;Override
public void onAnimationStart(View view,Animator animation)
//动画开始
view.setVisibility(View.INVISIBLE);

&#64;Override
public void onAnimationEnd(View view,Animator animation)
//动画结束

);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener()
&#64;Override
public void onClick(View v)
particleAnimator.boom(v);//开始动画

);

github地址:ParticleDismissLayout


推荐阅读
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
author-avatar
祝图net
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有